﻿/************************************************************************
** 文  件：
**	Detector.h
** 功  能：
**	AI对象检测器：包括视频处理、模型推理、报警记录等功能
** 作  者：
**	email:lixx2048@163.com
**  wechat:lixiang6153
**  QQ:941415509
** 日  期：
**	2024/03/15	14:00:00
** 说  明：
**	无
** 版  本：
**	2024/03/15	14:00:00		1.0		lixx2048@163.com
/************************************************************************/
#pragma once
#include <string>
#include <vector>
#include <thread>
#include <queue>
#include <memory>
#include <functional>
#include <unordered_map>
#include "opencv2/opencv.hpp"
#include "../entity/DeviceInfo.h"
#include "../video/Stream.h"
#include "../log/SysLog.h"
#include "../config/SystemConfig.h"
#include "../service/AlarmService.h"
#include "../util/TextUtil.h"
#include "../util/DateTime.h"
#include "../util/SystemHelper.h"
#include "../record/RecordManager.h"
#ifdef WIN32
#include "../video/Preview.h"
#endif
#include "OcrItem.h"

class Detector
{
	// 缓存信息
	typedef struct
	{
		// 分析设备
		std::string device;
		// 分析图片
		cv::Mat img;
		// 分析结果
		std::vector<OCR_RESULT> results;
	} OCR_CACHE;
	// 缓存项目
	typedef std::shared_ptr<OCR_CACHE> CacheItem;
	// 缓存队列
	typedef std::queue<CacheItem> CACHE_QUEUE;
public:
	// 构造函数
	Detector(DeviceInfo device);
	virtual ~Detector();

public:
	// 启动分析
	void Start();
	// 停止分析
	void Stop();
	// 设备变化
	bool Change(DeviceInfo info);
	// 手动录像
	bool StartRecord();
	// 停止录像
	void StopRecord();
	// 远程抓拍
	bool StartCapture();

protected:
	// 视频流回调
	int VideoBack(std::string, int, int, int, cv::Mat&, void*);
	// 报警回调
	int AlarmBack(std::string, std::vector<OCR_RESULT>&, cv::Mat&, void*);
	// 报警录像回调
	int AlarmRecordCB(std::string, std::string, std::string, int);
	// 手动录像回调
	int ManualRecordCB(bool finish, RECORD_INFO recordInfo);

protected:
	// 设备信息
	DeviceInfo m_device;
	// 运行标志
	bool m_run;
	// 启动线程
	std::thread m_thread;
	// 设备视频
	StreamPtr m_stream;
	// 视频帧数
	int m_frame_count;
	// 上次报警
	std::string m_last_type = "";
	// 预警时间
	TIME_POINT m_last_time;
	// 更图时间
	TIME_POINT m_last_update;
	// 结果缓存
	CACHE_QUEUE m_cache_queue;
	// 缓存大锁
	std::mutex m_cache_lock;
	// 录像管理
	RecordManager m_record_manager;
	// 最后录像
	std::string m_record_id = "";
};

typedef std::shared_ptr<Detector> DetectorPtr;
typedef std::unordered_map<std::string, DetectorPtr> Detectors;